﻿#include "test_simd.h"
#include "precitimer.h"
#include "simd_cph/simd_cp.h"
#include <iostream>

int main(int, char **)
{
    std::cout << "test测试" << std::endl;
    std::cout << "请选择测试模块：" << std::endl
              << "    1) SIMD基础指令测试" << std::endl
              << "    2) SIMD矢量运算测试" << std::endl
              << "    q) 退出测试" << std::endl
              << "输入以上对应测试项数字序号：";

    switch (std::cin.get())
    {
    case '1':
    {
        while (true) {

            std::cout
                    << "============================================" << std::endl
                    << "请选择以下其中一项输入对应的数字进行测试：" << std::endl
                    << "	a) char型数据相加       [+]；" << std::endl
                    << "	b) char型数据相减       [-]；" << std::endl
                    << "	c) short型数据相加      [+]；" << std::endl
                    << "	d) short型数据相减      [-]；" << std::endl
                    << "	e) short型数据左移     [<<]；" << std::endl
                    << "	f) short型数据右移     [>>]；" << std::endl
                    << "	g) int型数据相加        [+]；" << std::endl
                    << "	h) int型数据相减        [-]；" << std::endl
                    << "	i) int型数据二进制相与   [&]；" << std::endl
                    << "	j) int型数据二进制相或   [|]；" << std::endl
                    << "	k) int型数据二进制异或   [^]；" << std::endl
                    << "	l) int型数据左移        [<<]；" << std::endl
                    << "	m) int型数据右移        [>>]；" << std::endl
                    << "	n) float型数据相加       [+]；" << std::endl
                    << "	o) float型数据相减       [-]；" << std::endl
                    << "	p) float型数据相乘       [*]；" << std::endl
                    << "	r) float型数据相除       [/]；" << std::endl
                    << "	s) float型数据开平方   [sqrt]；" << std::endl
                    << "	t) float型数据取倒数    [1/x]；" << std::endl
                    << "	u) float型数据取最小值  [min]；" << std::endl
                    << "	v) float型数据取最大值  [max]；" << std::endl
                    << "	w) float型数据相等判定   [=]；" << std::endl
                    << "	x) float型数据不等判定  [!=]；" << std::endl
                    << "	y) float型数据小于判定   [<]；" << std::endl
                    << "	z) float型数据大于判定   [>]；" << std::endl
                    << "	1) float型数据小等于判定 [<=]；" << std::endl
                    << "	2) float型数据大等于判定 [>=]；" << std::endl
                    << "	q) 退出测试" << std::endl
                    << std::endl << "输入以上对应测试项数字序号：";

            switch (std::cin.get())
            {
            case 'a':
                test_base_char_plus();
                break;
            case 'b':
                test_base_char_minus();
                break;
            case 'c':
                test_base_short_plus();
                break;
            case 'd':
                test_base_short_minus();
                break;
            case 'e':
                test_base_short_shftl();
                break;
            case 'f':
                test_base_short_shftr();
                break;
            case 'g':
                test_base_int_plus();
                break;
            case 'h':
                test_base_int_minus();
                break;
            case 'i':
                test_base_int_band();
                break;
            case 'j':
                test_base_int_bor();
                break;
            case 'k':
                test_base_int_bxor();
                break;
            case 'l':
                test_base_int_shftl();
                break;
            case 'm':
                test_base_int_shftr();
                break;
            case 'n':
                test_base_float_plus();
                break;
            case 'o':
                test_base_float_minus();
                break;
            case 'p':
                test_base_float_mul();
                break;
            case 'r':
                test_base_float_div();
                break;
            case 's':
                test_base_float_sqrt();
                break;
            case 't':
                test_base_float_rcp();
                break;
            case 'u':
                test_base_float_min();
                break;
            case 'v':
                test_base_float_max();
                break;
            case 'w':
                test_base_float_eq();
                break;
            case 'x':
                test_base_float_neq();
                break;
            case 'y':
                test_base_float_lt();
                break;
            case 'z':
                test_base_float_gt();
                break;
            case '1':
                test_base_float_le();
                break;
            case '2':
                test_base_float_ge();
                break;
            case 'q':
                exit(0);
                break;
            default:
#ifdef _MSC_VER
                system("cls");
#else
                system("reset");
#endif
                continue;
            }

            std::cout
                    << "============================================" << std::endl;

#ifdef _MSC_VER
            system("pause && cls");	// 阻塞
#else
            //system("echo press any key to continue && reset");   // 阻塞
#endif

            std::cin.get();
        }

        break;
    }
    case '2':
    {
        while (true) {

            std::cout
                    << std::endl
                    << "============================================" << std::endl
                    << "请选择以下其中一项输入对应的数字进行测试(数据个数：" << ARRAY_COUNT << ")" << std::endl
                    << "	0) char型矢量数据相加  [+]；" << std::endl
                    << "	1) char型矢量数据相减  [-]；" << std::endl
                    << "	2) short型矢量数据相加 [+]；" << std::endl
                    << "	3) short型矢量数据相减 [-]；" << std::endl
                    << "	4) int型矢量数据相加   [+]；" << std::endl
                    << "	5) int型矢量数据相减   [-]；" << std::endl
                    << "	6) float型矢量数据相加 [+]；" << std::endl
                    << "	7) float型矢量数据相减 [-]；" << std::endl
                    << "	8) float型矢量数据相乘 [*]；" << std::endl
                    << "	9) float型矢量数据相除 [/]；" << std::endl
                    << "	q) 退出测试" << std::endl
                    << std::endl << "输入以上对应测试项数字序号： ";

            switch (std::cin.get())
            {
            case '0':
                test_char_plus();
                break;
            case '1':
                test_char_minus();
                break;
            case '2':
                test_short_plus();
                break;
            case '3':
                test_short_minus();
                break;
            case '4':
                test_int_plus();
                break;
            case '5':
                test_int_minus();
                break;
            case '6':
                test_float_plus();
                break;
            case '7':
                test_float_minus();
                break;
            case '8':
                test_float_mult();
                break;
            case '9':
                test_float_div();
                break;
            case 'q':
                exit(0);
                break;
            default:
#ifdef _MSC_VER
                system("cls");
#else
                system("reset");
#endif
                continue;
            }

            std::cout
                    << "============================================" << std::endl;

#ifdef _MSC_VER
            system("pause && cls");	// 阻塞
#else
            //system("echo press any key to continue && reset");   // 阻塞
#endif

            std::cin.get();
        }

        break;
    }
    case 'q':
    {
        exit(0);
        break;
    }
    default:
        break;
    }

    return 0;
}
